/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package servidorbancos.geneticos;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Random;
import servidorbancos.resources.Distancia;

/**
 *
 * @author thiago.araujo
 */
public class Individuo implements Comparable {

    public int[] cromossomo;
    public double funcaoObjetivo = 0.0;
    public double[][] distancias;

    public Individuo(double[][] distancias) 
    {
        this.distancias = distancias;
    }

    //Inicializa aleatoriamente o cromossomo.
    //mas deve manter o inicio e o final, para sempre sair do mesmo ponto: a origem.
    public void inicializarAleatorio(int tamanho) {

        ArrayList<Integer> aux = new ArrayList<Integer>() {
        };
        for (int i = 1; i < tamanho - 1; i++) {
            aux.add(i);
        }
        Collections.shuffle(aux);

        //adiciono a origem no fim e no comeco
        aux.add(0, 0);
        aux.add(0);

        if (cromossomo == null) {
            cromossomo = new int[tamanho];
        }

        for (int i = 0; i < aux.size(); i++) {
            cromossomo[i] = (int) aux.get(i);
        }
        calculaFuncaoObjetivo();
    }

    double calculaFuncaoObjetivo()
    {
        double f = 0;
        for (int i = 0; i < cromossomo.length-1; i++) {
            f += distancias[cromossomo[i]][cromossomo[i+1]];
        }
        funcaoObjetivo = f;
        return f;
    }

    /* Overload compareTo method */
    @Override
    public int compareTo(Object obj) {
        Individuo tmp = (Individuo) obj;
        if (this.funcaoObjetivo < tmp.funcaoObjetivo) {
            return -1;
        } else if (this.funcaoObjetivo > tmp.funcaoObjetivo) {
            return 1;
        }
        return 0;
    }

    @Override
    public String toString() {
        String s = "";
        for (int i = 0; i < cromossomo.length; i++) {
            s += cromossomo[i] + " ";
        }
        s += funcaoObjetivo;
        return s;
    }
}
